﻿#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initStatusBar();
    ui->m_spb_row_num->setValue(10);

    ui->m_rb_selectItem->setChecked(true);
    ui->m_cb_headerH->setChecked(true);
    ui->m_cb_headerV->setChecked(true);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//状态栏的相关初始化
void MainWindow::initStatusBar()
{
    m_labCellIndex = new QLabel("当前单元格坐标：", this);
    m_labCellType = new QLabel("当前单元格类型：", this);
    m_labStudID = new QLabel("学生ID:", this);
    m_labCellIndex->setMinimumWidth(250);
    m_labCellType->setMinimumWidth(250);
    m_labStudID->setMinimumWidth(250);

    ui->statusbar->addWidget(m_labCellIndex);
    ui->statusbar->addWidget(m_labCellType);
    ui->statusbar->addWidget(m_labStudID);
}

#include <QRandomGenerator>
void MainWindow::CreateTableWidgetOneItem(int i, QDate& birth)
{
    QString stu_name = QString("name_%1").arg(i);
    QString stu_sex = ((i%2)==0)?"男":"女";
    bool is_party = ((i%2)==0)?true:false;
    //QRandomGenerator生成随机数的类 伪随机数生成算法 QRand是qt早期一个简单的伪随机数生成函数
    int score = QRandomGenerator::global()->bounded(60,100);
    uint stu_id = 202105000;


    //接下来就是每个项的初始化，这里需要设置特定的列数进行初始化 用text构造
    QTableWidgetItem *item = new QTableWidgetItem(stu_name, MainWindow::ctName);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    item->setData(Qt::UserRole, QVariant(i+stu_id));
    ui->m_tableWidget->setItem(i, colName, item);

    QIcon   icon;
    if (stu_sex=="男")
        icon.addFile(":/images/icons/boy.ico");
    else
        icon.addFile(":/images/icons/girl.ico");

    item = new QTableWidgetItem(stu_sex, MainWindow::ctSex);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    item->setIcon(icon);
    item->setFlags(Qt::ItemIsSelectable |Qt::ItemIsEnabled); //不允许编辑
    ui->m_tableWidget->setItem(i, colSex, item);

    //出生日期
    QString str=birth.toString("yyyy-MM-dd");
    item = new QTableWidgetItem(str, MainWindow::ctBirth);
    item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
    ui->m_tableWidget->setItem(i, colBirth, item);

    //民族
    item = new QTableWidgetItem(QString("汉族"), MainWindow::ctNation);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    ui->m_tableWidget->setItem(i, colNation, item);

    //分数
    item = new QTableWidgetItem(QString::number(score), MainWindow::ctScore);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    ui->m_tableWidget->setItem(i, colScore, item);

    //是否民族
    item = new QTableWidgetItem(QString("党员"), MainWindow::ctPartyM);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
    item->setCheckState((is_party)?Qt::Checked:Qt::Unchecked);
    item->setBackground(QBrush(Qt::yellow));
    ui->m_tableWidget->setItem(i, colPartyM, item);
}


//主要练习tablewidget的初始化，增删改查，以及tablewidget的相关槽函数
void MainWindow::on_m_pbn_setup_header_clicked()
{
    QStringList header_list;
    header_list<<"姓名"<<"性别"<<"出生日期"<<"民族"<<"分数"<<"是否党员";

    int len = header_list.count();
    ui->m_tableWidget->setColumnCount(len);
    for(int i=0; i<len; i++)
    {
        QTableWidgetItem *headerItem = new QTableWidgetItem(header_list.at(i));

        QFont font = headerItem->font();
        font.setBold(true);
        font.setPointSize(11);

        headerItem->setForeground(QBrush(Qt::red)); //设置单元格中字体颜色？
        headerItem->setFont(font);
        ui->m_tableWidget->setHorizontalHeaderItem(i, headerItem);
    }

}

void MainWindow::on_m_pbn_setup_row_clicked()
{
    int count = ui->m_spb_row_num->value();
    ui->m_tableWidget->setRowCount(count);
    ui->m_tableWidget->setAlternatingRowColors(ui->m_cb_rowColor->isChecked());
}

//按照特定内容 初始化表格
void MainWindow::on_m_pbn_init_table_clicked()
{
    //按照行数  依次进行初始化
    int count = ui->m_tableWidget->rowCount();
    ui->m_tableWidget->clearContents();

    QDate birth(2002, 01, 07);
    for(int i=0; i<count; i++)
    {
        CreateTableWidgetOneItem(i, birth);
        birth = birth.addDays(30);
    }
}

void MainWindow::on_m_pbn_insert_row_clicked()
{
    int cur_row = ui->m_tableWidget->currentRow();
    ui->m_tableWidget->insertRow(cur_row);
    QDate birth = QDate::fromString("2002-10-1","yyyy-M-d");
    CreateTableWidgetOneItem(cur_row, birth);
}

void MainWindow::on_m_pbn_add_row_clicked()
{
    int cur_row = ui->m_tableWidget->rowCount();
    ui->m_tableWidget->insertRow(cur_row);
    QDate birth = QDate::fromString("2002-10-1","yyyy-M-d");
    CreateTableWidgetOneItem(cur_row, birth);
}

void MainWindow::on_m_pbn_del_currow_clicked()
{
    int cur_row = ui->m_tableWidget->currentRow();
    ui->m_tableWidget->removeRow(cur_row);
}

void MainWindow::on_m_pbn_auto_heigh_clicked()
{
    ui->m_tableWidget->resizeRowsToContents();
}

void MainWindow::on_m_pbn_auto_width_clicked()
{
    ui->m_tableWidget->resizeColumnsToContents();
}

void MainWindow::on_m_pbn_table_to_text_clicked()
{
    //获取所有项内容到对应的文本框中
    QTableWidgetItem *item ;
    ui->m_pte_display->clear();

    int rowcount = ui->m_tableWidget->rowCount();
    int colcount = ui->m_tableWidget->columnCount();
    for(int i=0; i<rowcount; i++)
    {
        QString str = QString("第%1行:").arg(i+1);
        for(int j=0; j< colcount-1; j++)
        {
            item = ui->m_tableWidget->item(i, j);
            str += item->text()+"  ";
        }
        item = ui->m_tableWidget->item(i, colPartyM);

        str+=(item->checkState()==Qt::Checked?"党员":"群众");
        ui->m_pte_display->appendPlainText(str);
    }
}

void MainWindow::on_m_cb_enableEdit_clicked(bool checked)
{
    if(checked)
        ui->m_tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked
                                           | QAbstractItemView::SelectedClicked);
    else
        ui->m_tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //不允许编辑
}

void MainWindow::on_m_cb_rowColor_clicked(bool checked)
{
    ui->m_tableWidget->setAlternatingRowColors(checked);
}

void MainWindow::on_m_cb_headerH_clicked(bool checked)
{
    ui->m_tableWidget->horizontalHeader()->setVisible(checked);
}

void MainWindow::on_m_cb_headerV_clicked(bool checked)
{
    ui->m_tableWidget->verticalHeader()->setVisible(checked);
}

//行选择
void MainWindow::on_m_rb_selectRow_clicked()
{
    ui->m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
}

//单元格选择
void MainWindow::on_m_rb_selectItem_clicked()
{
    ui->m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);
}

//单元格发生变化时触发  获取必要信息显示在toolbar区域
void MainWindow::on_m_tableWidget_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
{
    Q_UNUSED(previousRow);
    Q_UNUSED(previousColumn);
    QTableWidgetItem *item = ui->m_tableWidget->item(currentRow, currentColumn);
    if(item == nullptr) return;
    m_labCellIndex->setText(QString::asprintf("当前单元格坐标：%d 行，%d 列",currentRow,currentColumn));

    int cellType=item->type();      //获取单元格的类型
    m_labCellType->setText(QString::asprintf("当前单元格类型：%d",cellType));

    item=ui->m_tableWidget->item(currentRow,MainWindow::colName);   //取当前行第1列的单元格的item
    uint ID=item->data(Qt::UserRole).toUInt();        //读取用户数据
    m_labStudID->setText(QString::asprintf("学生ID：%d",ID));      //学生ID
}
/*
 *  cell是获取相关行和列的槽函数   item是获取相关项指针的槽函数
    itemChanged(QTableWidgetItem *item)：
        当某个单元格内容发生变化时触发，通过参数item获取发生变化的单元格对象。
    currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)：
        当当前选中的单元格改变时触发，可以获取当前选中和之前选中的行号和列号。
    cellDoubleClicked(int row, int column)：
        当双击某个单元格时触发，通过row和column参数获取双击的行号和列号。
    cellPressed(int row, int column)：
        当点击某个单元格时触发，通过row和column参数获取点击的行号和列号。
    cellEntered(int row, int column)：
        当鼠标进入某个单元格时触发，通过row和column参数获取进入的行号和列号。
    itemSelectionChanged()：
        当选择项发生改变时触发，可用于处理多个选中项的情况。
    currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)：
        当当前选中项改变时触发，通过current和previous参数分别获取当前选中项和之前选中项的指针。
    itemActivated(QTableWidgetItem *item)：
        当用户在表格中选择并按下回车键或空格键时触发，通过参数item获取被激活的单元格对象。
    itemClicked(QTableWidgetItem *item)：
        当单击某个单元格时触发，通过参数item获取被点击的单元格对象。
    itemDoubleClicked(QTableWidgetItem *item)：
        当双击某个单元格时触发，通过参数item获取双击的单元格对象。
    clear()：
        清除所有表格内容。
*/